#include <stdio.h>
#include <time.h>
#include <string.h>
#include "log.h"

static int level = LOG_INFO;
static int LOG_BUFFER_SIZE = 2048;
static const char* loglevels[] =
{
    "emerge!", "alert!", "critical!", "error!", "warn!", "notice:", "info:", "debug:"
};

void set_loglevel( int log_level )
{
    level = log_level;
}

void log( int log_level,  const char* file_name, int line_num, const char* format, ... )
{
    if ( log_level > level )
    {
        return;
    }

    time_t tmp = time( NULL );						//获得机器时间
    struct tm* cur_time = localtime( &tmp );		//返回一个以tm结构表达的机器时间信息
    if ( ! cur_time )
    {
        return;
    }    

    char arg_buffer[ LOG_BUFFER_SIZE ];
    memset( arg_buffer, '\0', LOG_BUFFER_SIZE );
    strftime( arg_buffer, LOG_BUFFER_SIZE - 1, "[ %x %X ] ", cur_time );			//函数格式化一个时间字符串，%x 标准的日期串，%X 标准的时间串
    printf( "%s", arg_buffer );
    printf( "%s:%04d ", file_name, line_num );
    printf( "%s ", loglevels[ log_level - LOG_EMERG ] );

    va_list arg_list;						// 定义一个va_list型的变量，这个变量指向参数的指针
    va_start( arg_list, format );			//用va_start宏初始化变量，这个宏的第二个参数是第一个可变参数的前一个参数，是一个固定的参数
    memset( arg_buffer, '\0', LOG_BUFFER_SIZE );		
    vsnprintf( arg_buffer, LOG_BUFFER_SIZE - 1, format, arg_list );
    printf( "%s\n", arg_buffer );
    fflush( stdout );		
    va_end( arg_list );
}
